<?php

namespace app\api\controller;

use think\Controller;
use think\Db;
use think\Request;
use app\api\model\YaoqingRecords as Income;

class Commission extends Common
{

    /**
     * 计算当前用户的上级用户的分佣
     * 用户分佣规则：
     * 1. 充值(一般情况为男用户)：
     *    他的上级用户根据不同用户等级对应不同分佣比例：
     *        - 直推奖励：会员 25%，超级会员 30%，运营商 35%，合伙人 40%
     *        - 团队奖励： 会员 10%，超级会员 15%，运营商 20%，合伙人 25%
     * 2. 社交(只针对女用户)：当前与男用户进行社交（包括文字、语音、语音通话、视频通话、回复）的女用户收益金额为男用户消费金额的40%,这个比例是固定的：
     * 这个要在外面计算，计算再调用此函数计算她的上级分佣，即：比例男用户A和当前女用户B进行社交消费了100，则当前女用户B获得100*0.4=40的收益金额，这个收益金额再根据下面的分佣规则计算
     *    她的上级用户根据不同用户等级对应不同分佣比例：
     *        - 直推奖励：会员 20%，超级会员 25%，运营商 30%，合伙人 35%
     *        - 团队奖励： 会员 5%，超级会员 10%，运营商 10%，合伙人 5%
     * 
     * @param int $user_id 当前触发事件的用户ID（充值时为当前充值用户的ID;女用户社交时（包括文字、语音、、语音通话、视频通话、回复）收益）为当前女用户的ID）
     * @param float $amount 金额（当前用户的充值金额或当前社交女用户的收益金额）
     * @param string $type 类型 ('recharge' = 充值, 'social' = 社交)
     * @param string $social_type 社交细分类型 (0文字|1图片|2语音|3视频|8礼物|9语音通话|10视频通话|12回复)
     * @param int $sex 用户性别（1 = 男, 2 = 女）
     * @return array 返回包含所有分佣用户的详细记录
     */
    public function calculateCommission($user_id, $amount, $type='social', $sex, $social_type=0)
    {
       // \think\Log::write($user_id, 'error');
       // \think\Log::write($amount, 'error');
       // \think\Log::write($type, 'error');
       // \think\Log::write($sex, 'error');
       // \think\Log::write($social_type, 'error');
        $social_types = [
            0 => '文字',
            1 => '图片',
            2 => '语音', 
            3 => '视频',
            9 => '语音通话',
            10 => '视频通话',
            12 => '回复'
        ];
        
        // 查询当前用户信息
        $user = Db::name('user')->where(['id' => $user_id])->find();
        if (!$user || !$user['yqr']) {
            // 用户不存在或没有邀请人，不分佣
            return [];
        }

        // 社交场景特殊处理：女用户与男用户社交时，女用户获得40%的收益
        $base_amount = $amount;
        // if ($type == 'social' && $sex == 2) {
        //     // 女用户社交收益为消费金额的40%
        //     $base_amount = $amount * 0.4;
        // }

        // 获取该用户的邀请链，最多4层
        $inviter_chain = $this->getInviterChain($user['yqr']);
        if (empty($inviter_chain)) {
            return [];
        }

        $commission_results = [];

        // 遍历每一层邀请人
        foreach ($inviter_chain as $depth => $inviter) {
            $level = (int)$inviter['level']; // 获取邀请人等级
            $relation = ($depth === 0) ? 'direct' : 'team'; // 第一层为直推，其余为团队

            // 安全获取下级等级
            $sub_level = isset($inviter_chain[$depth - 1]) ? (int)$inviter_chain[$depth - 1]['level'] : null;
            
            // 获取对应规则下的分佣比例
            $rate = $this->getRateByRule($relation, $level, $sub_level, $type, $sex);

            // 安全检查平级关系
            $is_same_level = isset($inviter_chain[$depth - 1]) && $level == 3 && $inviter_chain[$depth - 1]['level'] == 3;
            
            if($relation == 'team' && $is_same_level){
                $relation_name = '平级';
            }else if($relation == 'direct'){
                $relation_name = '直推';
            }else if($relation == 'team'){
                $relation_name = '团队';
            }else{
                $relation_name = '';
            }
            
            if ($rate > 0) {
                // 计算分佣金额 - 使用base_amount作为基数
                $money = round($base_amount * $rate, 2);
                $score = $money;

                // 获取备注信息
                $remark = '';
                if ($type == 'recharge') {
                    // 充值类型的备注
                    if ($relation_name == '直推') {
                        $remark = "{$user['name']}({$user_id}) 充值 直推奖励 +{$score} 积分";
                    } elseif ($relation_name == '平级') {
                        $remark = "{$user['name']}({$user_id}) 充值 平级奖励 +{$score} 积分";
                    } else {
                        $remark = "{$user['name']}({$user_id}) 充值 团队奖励 +{$score} 积分";
                    }
                } else if ($type == 'social') {
                    // 社交类型的备注
                    switch ($social_type) {
                        case 0:
                            $remark = "{$user['name']}({$user_id}) 聊天 {$relation_name}奖励 +{$score} 积分";
                            break;
                        case 1:
                            $remark = "收到{$user['name']}({$user_id})发送的图片 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 2:
                            $remark = "收到{$user['name']}({$user_id})发送的语音 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 3:
                            $remark = "收到{$user['name']}({$user_id})发送的视频 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 8:
                            $remark = "收到 {$user['name']}({$user_id}) 的礼物 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 9:
                            $remark = "接听 {$user['name']}({$user_id}) 的语音通话 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 10:
                            $remark = "接听 {$user['name']}({$user_id}) 的视频通话 {$relation_name}收益 +{$score} 积分";
                            break;
                        case 12:
                            $remark = "回复{$user['name']}({$user_id})的消息获得 {$relation_name}积分收益 +{$score} 积分";
                            break;
                        default:
                            $remark = "{$user['name']}({$user_id}) 聊天 {$relation_name}奖励 +{$score} 积分";
                    }
                }

                $current_balance = Db::name('user')->where(['id' => $inviter['id']])->value('score');
                
                // 安全获取touid和source_uid
                $touid = isset($inviter_chain[$depth - 1]) ? $inviter_chain[$depth - 1]['id'] : $user_id;
                $source_uid = isset($inviter_chain[$depth - 2]) ? $inviter_chain[$depth - 2]['id'] : $user_id;
                
                //$type = 1;
                // 插入记录到分佣订单表
                Db::name('yaoqing_order')->insert([
                    'uid'       => $inviter['id'],                // 分佣人ID
                    'touid'     => $touid,                        // 来源用户ID
                    'money'     => $money,                        // 分佣金额
                    'socre'     => $score,                        // 分佣金额 * 10 为积分
                    'source_uid' => $source_uid,                  // 来源用户
                    'type'      => $type,                         // 分佣类型
                    'rate'      => $rate,                         // 分佣比例
                    'content'   => $remark,
                    'balance'   => $current_balance + $money,
                    'data'      => 0,
                    'time'      => time()                         // 创建时间
                ]);
                
                // 直接调用YaoqingRecords记录分佣
                Income::index(
                    $inviter['id'], 
                    $user_id, 
                    $money, 
                    $remark, 
                    1, 
                    '', 
                    0, 
                    0, 
                    $money, 
                    $user_id
                );
                
                // 保存分佣结果
                $commission_results[] = [
                    'user_id'  => $inviter['id'],
                    'name' => $inviter['name'],
                    'level'    => $level,
                    'rate'     => $rate,
                    'money'    => $money,
                    'score'    => $score,
                    'relation' => $relation,
                    'remark'   => $remark
                ];
            }
        }

        return $commission_results;
    }

    /**
     * 获取上下级之间的分佣比例
     * @param string $relation 关系类型 ('direct' 或 'team')
     * @param int $level 当前分佣用户等级
     * @param int|null $sub_level 被邀请者（或下级）等级，仅团队关系下有效
     * @param string $type 类型（'recharge'或'social'）
     * @param int $sex 性别（1=男，2=女）
     * @return float 分佣比例
     */
    private function getRateByRule($relation, $level, $sub_level, $type, $sex)
    {
        // 分佣比例规则表，区分直推和团队、等级、性别和行为类型
        $rules = [
            'recharge' => [
                'direct' => [ // 男用户充值直推比例
                    0 => 0.25, // 会员 25%
                    1 => 0.30, // 超级会员 30%
                    2 => 0.35, // 运营商 35%
                    3 => 0.40, // 合伙人 40%
                ],
                'team' => [  // 男用户充值团队比例（上级 -> 下级）
                    1 => [0 => 0.05], // 超级会员 5%
                    2 => [0 => 0.10, 1 => 0.05], // 运营商 -> 会员/超级会员 10%/5%
                    3 => [0 => 0.15, 1 => 0.10, 2 => 0.05, 3 => 0.02], // 合伙人 -> 各级别
                ],
            ],
            'social' => [
                'direct' => [ // 女用户社交收益直推比例
                    0 => 0.20, // 会员 20%
                    1 => 0.25, // 超级会员 25%
                    2 => 0.30, // 运营商 30%
                    3 => 0.35, // 合伙人 35%
                ],
                'team' => [ // 女用户社交收益团队比例
                    1 => [0 => 0.05], // 超级会员 -> 会员 5%
                    2 => [0 => 0.10, 1 => 0.05], // 运营商 -> 会员/超级会员 10%/5%
                    3 => [0 => 0.15, 1 => 0.10, 2 => 0.05, 3 => 0.025], // 合伙人 -> 各级别
                ],
            ]
        ];

        // 根据类型确定主分支
        $mode = $type;

        if ($relation === 'direct') {
            return $rules[$mode]['direct'][$level] ?? 0;
        }

        if ($relation === 'team' && $sub_level !== null) {
            return $rules[$mode]['team'][$level][$sub_level] ?? 0;
        }

        return 0;
    }

    /**
     * 获取用户的上级邀请链，最多4层
     * @param string $inviter_code 当前用户的邀请人邀请码
     * @return array 上级邀请人数组，从第一层开始依次向上
     */
    private function getInviterChain($inviter_code)
    {
        $chain = [];
        $current_code = $inviter_code;

        for ($i = 0; $i < 4; $i++) {
            if (!$current_code) break;

            $inviter = Db::name('user')->where(['yqm' => $current_code])->find();
            if (!$inviter) break;

            $chain[] = $inviter;
            $current_code = $inviter['yqr'];
        }

        return $chain;
    }
}
